package com.carboy.launch;

import android.content.Context;
import android.os.Bundle;

import com.amap.api.navi.AMapNaviListener;
import com.amap.api.navi.model.AMapNaviInfo;
import com.amap.api.navi.model.AMapNaviLocation;
import com.carboy.launch.R;
import com.carboy.launch.widgets.CustomToast;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;

/**
 * 语音合成控制器
 */
public class TTSControllerNavi implements SynthesizerListener, AMapNaviListener {

	// 当前上下文
	private Context mContext;
	// 语音合成对象
	private SpeechSynthesizer mTts;
	// 判断是否销毁
	boolean isfinish = true;
	// 单例模式
	private static TTSControllerNavi ttsManager = null;

	TTSControllerNavi(Context mContext) {
		this.mContext = mContext;
	}

	public static TTSControllerNavi getInstance(Context context) {
		if (ttsManager == null) {
			ttsManager = new TTSControllerNavi(context);
		}
		return ttsManager;
	}

	/**
	 * 语音合成
	 */
	public void init() {
		// 初始化合成对象.
		if (null == mTts) {
			// 创建合成对象.
			mTts = SpeechSynthesizer.createSynthesizer(mContext,
					mTtsInitListener);
			initSpeechSynthesizer();
		}
	}

	/**
	 * 初期化监听。
	 */
	private InitListener mTtsInitListener = new InitListener() {
		@Override
		public void onInit(int code) {
			if (code != ErrorCode.SUCCESS) {
				CustomToast.showToast(mContext, "初始化失败,错误码：" + code);
			}
		}
	};

	private void initSpeechSynthesizer() {
		// 设置发音人
		mTts.setParameter(SpeechConstant.VOICE_NAME,
				mContext.getString(R.string.preference_default_tts_role));
		// 设置语速
		mTts.setParameter(SpeechConstant.SPEED,
				"" + mContext.getString(R.string.preference_key_tts_speed));
		// 设置音量
		mTts.setParameter(SpeechConstant.VOLUME,
				"" + mContext.getString(R.string.preference_key_tts_volume));
		// 设置语调
		mTts.setParameter(SpeechConstant.PITCH,
				"" + mContext.getString(R.string.preference_key_tts_pitch));
	}

	/**
	 * 使用SpeechSynthesizer合成语音，不弹出合成Dialog.
	 */
	public void playText(String playText) {
		if (!isfinish) {
			return;
		}
		this.init();
		// 进行语音合成.
		mTts.startSpeaking(playText, this);
	}

	/**
	 * 暂停语音合成
	 */
	public void stopSpeaking() {
		if (mTts != null) {
			mTts.stopSpeaking();
		}
	}

	/**
	 * 开始语音合成
	 */
	public void startSpeaking() {
		isfinish = true;
	}

	@Override
	public void onBufferProgress(int arg0, int arg1, int arg2, String arg3) {

	}

	@Override
	public void onCompleted(SpeechError arg0) {
		isfinish = true;
	}

	@Override
	public void onSpeakBegin() {
		isfinish = false;

	}

	@Override
	public void onSpeakPaused() {

	}

	@Override
	public void onSpeakProgress(int arg0, int arg1, int arg2) {

	}

	@Override
	public void onSpeakResumed() {

	}

	@Override
	public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {

	}

	/**
	 * 到达目的地后回调函数。
	 */
	@Override
	public void onArriveDestination() {
		this.playText("到达目的地");
	}

	/**
	 * 驾车路径导航到达某个途经点的回调函数。
	 */
	@Override
	public void onArrivedWayPoint(int arg0) {
	}

	/**
	 * 步行或者驾车路径规划失败后的回调函数。
	 */
	@Override
	public void onCalculateRouteFailure(int arg0) {
		this.playText("路径计算失败，请检查网络或输入参数");
	}

	/**
	 * 步行或者驾车路径规划成功后的回调函数。
	 */
	@Override
	public void onCalculateRouteSuccess() {
		String calculateResult = "路径计算就绪";
		this.playText(calculateResult);
	}

	/**
	 * 模拟导航停止后回调函数。
	 */
	@Override
	public void onEndEmulatorNavi() {
		this.playText("导航结束");
	}

	/**
	 * 导航播报信息回调函数。 参数: type - 播报类型，包含导航播报、前方路况播报和整体路况播报，类型见类属性。 text - 播报文字。
	 */
	@Override
	public void onGetNavigationText(int arg0, String arg1) {
		this.playText(arg1);
	}

	/**
	 * 导航创建失败时的回调函数。
	 */
	@Override
	public void onInitNaviFailure() {
	}

	/**
	 * 导航创建成功时的回调函数。
	 */
	@Override
	public void onInitNaviSuccess() {
	}

	/**
	 * 当GPS位置有更新时的回调函数。
	 */
	@Override
	public void onLocationChange(AMapNaviLocation arg0) {
	}

	/**
	 * 驾车导航时，如果前方遇到拥堵时需要重新计算路径的回调。
	 */
	@Override
	public void onReCalculateRouteForTrafficJam() {
		this.playText("前方路线拥堵，路线重新规划");
	}

	/**
	 * 步行或驾车导航时,出现偏航后需要重新计算路径的回调函数。
	 */
	@Override
	public void onReCalculateRouteForYaw() {
		this.playText("您已偏航");
	}

	/**
	 * 启动导航后回调函数。 导航类型，1 ： 实时导航，2 ：模拟导航。
	 */
	@Override
	public void onStartNavi(int arg0) {
	}

	/**
	 * 当前方路况光柱信息有更新时回调函数。
	 */
	@Override
	public void onTrafficStatusUpdate() {
	}

	/**
	 * 用户手机GPS设置是否开启的回调函数。
	 */
	@Override
	public void onGpsOpenStatus(boolean arg0) {
	}

	/**
	 * 当驾车或者步行实时导航或者模拟导航有位置变化时都会回调。
	 */
	@Override
	public void onNaviInfoUpdated(AMapNaviInfo arg0) {
	}
}
